package com.xzk.ExpressInnWeb.service;

import com.xzk.ExpressInnWeb.bean.Express;
import com.xzk.ExpressInnWeb.dao.BaseExpressDao;
import com.xzk.ExpressInnWeb.dao.daoImp.CourierDaoMySQL;
import com.xzk.ExpressInnWeb.dao.daoImp.ExpressDaoMySQL;
import com.xzk.ExpressInnWeb.exception.DuplicateCodeException;
import com.xzk.ExpressInnWeb.exception.SmsServiceNotAvailableException;
import com.xzk.ExpressInnWeb.util.ExUtil;
import com.xzk.ExpressInnWeb.util.SmsUtil;

import java.util.List;
import java.util.Map;

public class ExpressService {

    private static BaseExpressDao dao = new ExpressDaoMySQL();

    public static List<Map<String, Integer>> consoleEx() {
        return dao.consoleEx();
    }

    public static List<Express> findAllEx(boolean limit, int offset, int exSize) {
        return dao.findAllEx(limit,offset,exSize);
    }

    public static Express findExByExNum(String ex_num) {
        return dao.findExByExNum(ex_num);
    }

    public static Express findExByCode(String code) {
        return dao.findExByCode(code);
    }

    public static List<Express> findAllExByUserPhone(String userPhone) {
        return dao.findAllExByUserPhone(userPhone);
    }

    public static List<Express> findAllExByStaffPhone(String staffPhone) {
        return dao.findAllExByStaffPhone(staffPhone);
    }

    /**
     * 插入新的快递信息记录行
     * 需要针对取件码重复的情况进行处理
     * 即处理抛出的自定义异常DuplicateCodeException
     * 生成取件码并通过setCode在需要插入的快递对象内设置
     * 如果取件码重复导致DuplicateCodeException异常
     * 则递归调用本方法
     *
     * @param ex 需要插入的新快递对象
     * @return 插入操作成功返回true，否则返回false
     */
    public static boolean insertEx(Express ex) throws SmsServiceNotAvailableException {
        try {
            ex.setCode(ExUtil.generateCode());
            boolean insert = dao.insertEx(ex);
            if (insert) {
                if (ex.getStaffphone() != null) {
                    CourierService.updateDelivery(ex.getStaffphone());
                }
                SmsUtil.sendSMS(ex.getUserphone(),ex.getCode());
            }
            return insert;
        } catch (DuplicateCodeException e) {
            return insertEx(ex);
        }
    }

    /**
     * 若修改用户手机号码，则需要更改取件码
     * 即删除原id的快递并重新插入新的快递信息
     * 调用本Service类对象的insert方法自动生成新的不重复的取件码
     * 并返回结果
     *
     * @param id 需要更新的快递id
     * @param newEx 更新信息的容器快递对象
     * @return 更新成功返回true，否则返回false
     */
    public static boolean updateEx(int id, Express newEx) throws SmsServiceNotAvailableException {
        if (newEx.getUserphone() != null) {
            dao.deleteEx(id);
            return insertEx(newEx);
        } else {
            return dao.updateEx(id, newEx);
        }
    }

    public static boolean updateExStatus(String code) {
        return dao.updateExStatus(code);
    }

    public static boolean deleteEx(int id) {
        return dao.deleteEx(id);
    }

    public static List<Map> getLazyBoardValues(int code){
        return dao.getLazyBoardValues(code);
    }
}
